package com.LeeCode;

/**
 * 两两交换链表中的节点
 */

public class Code024 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7};
        ListNode head = Utils.arrayToListNode(nums);
        Utils.printListNode(head);
        System.out.println();
        Utils.printListNode(new Code024().swapPairs(head));

    }

    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null)
            return head;

        ListNode p1 = head, p2 = head.next, p3 = head.next.next;
        // p1指向要交换节点的前一个节点， p2指向要交换的第一个节点， p3指向交换节点的后一个节点
        ListNode newhead = p2;
        p1.next = p2;
        p2.next = p1;
        p1.next = p3;

        while (p3 != null && p3.next != null) { // 保证还有两个可交换节点
            p2 = p3;
            p3 = p3.next.next;

            p1.next = p2.next;
            p1.next.next = p2;
            p2.next = p3;

            p1 = p2;
        }
        return newhead;
    }
}
